WIP: SushiSwap のマイグレーション
アドレス
EOA、コントラクトをデプロイするためのアカウントの様子
ガバナンスと tx 実行の方法的な話
48H のディレイってどこからきてるんだろう?
Governance 周りは Compound から持ってきてる
GovernorAlpha.sol
Timelock.sol
Timelock contract の動作
queue した tx が48 時間後に自動的に実行されるわけではなくて、自分で execute の tx を叩く。execute された時に所定のディレイ(この例では 48 時間の秒数表現である 172800 uint256 が delay に設定されている)が経過してなければ失敗する
address.call.value(value)(payload) は v0.7 で address.call{value: 1 ether}(payload) のように書けるようになった(けど、SushSwap は 0.6.12 固定なので古い書き方)
Uniswap からのマイグレーションの方法
tx の event log からわかること
MasterChef.migrate(uint256 _pid)
_pid は PoolInfo[] public poolInfo として管理している array の index
input の 0 を例にすると ETH - Tether の pool なことがわかる
_pid で指定した pool の管理する token contract に入っている 全額を migrator に approve する
migrator.migrate(IUniswapV2Pair orig) を実行。返り値として新しい token contract の address を受け取る。その token contract に approve した全額が移っていることを確認
migrator.migrate()
L33 は基本的に true になる想定なのかな?
Migrator コントラクトに tx がないのは、Timelock コントラクトの ExecuteTransaction でメタトランザクション的に実行されるから internal tx しか残らない。
orig が from, 新しく作成する pair が to な migration
factory.createPair(token0, token1) で Uniswap と同じやり方で Pair == Pool コントラクトを作成する
orig.transferFrom(msg.sender, address(orig), lp);
msg.sender は internal tx では internal tx を投げた contract なので MasterChef。MasterChef から orig に全額を transfer
orig.burn(address(pair));
pair.mint(msg.sender);
IUniswapV2Pair
factory から作成される通貨ペアを表すコントラクト。管理する通貨ペアのトークンコントラクトを token0, token1 として持っていたり、それらでスワップするための swap() やリザーブ数量を取得する getReserve() なんかが用意されている。
構造
Factory
LP token
token0
token1
Migrator